package cn.itsource.base.service.impl;

import cn.itsource.base.service.ICodeService;
import cn.itsource.util.SmsUtils;
import cn.itsource.util.StrUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class CodeServiceImpl implements ICodeService {

    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * 1.生成一个验证码 【6位数字验证码】
     * 2.使用运营商发送验证码
     * 3.找个位置【redis】把发送的验证码 存起来
     *
     * @param map
     */
    @Override
    public void sendCode(Map<String, String> map) {
        //要发送验证码的手机号
        String phone = map.get("phone");
        String codeType = map.get("codeType");
        //1.生成一个验证码 【6位数字验证码】
        String code = StrUtils.getRandomString(6);
        /*
            判断请求的合法性【一分钟内容同一手机号重复发送问题】
            1.redis存储验证码发送的时间
               key       value
            15008495702  9527
            存储时间
               key             value
           15008495702:类型   9527:时间戳
            2.根据手机号获取 验证码 --9527:时间戳  使用:分割
            使用当前时间-存储时间<60 请求不合法
         */
        //根据手机号获取redis里面是否有存储的数据
        String codeInRedis = (String)redisTemplate.opsForValue().get(phone+":"+codeType);
        if(codeInRedis!=null){//用户不是第一次发送验证码
            //获取验证码存储时间
            String oldTime=codeInRedis.split(":")[1];
            if ( System.currentTimeMillis()-Long.valueOf(oldTime)<60*1000){
                //请求是不合法的 一分钟内重复请求
                throw new RuntimeException("操作过于频繁，请稍后再试");
            }else {//已经发送验证码，这是一个合法的请求--发送的验证码和上一次是一致
                code=codeInRedis.split(":")[0];
            }
        }

        //2.发送验证码
        //SmsUtils.send(phone,code);
        //3.使用redis存储验证码
        //|组装value值
        String codeTime=code+":"+System.currentTimeMillis();
        redisTemplate.opsForValue().set(phone+":"+codeType,codeTime,5, TimeUnit.MINUTES);
        System.out.println("本次的验证码为："+code);
    }
}
